Análise Exploratória
## rows columns discrete_columns continuous_columns all_missing_columns
## 1 2380 37 26 11 0
## total_missing_values complete_rows total_observations memory_usage
## 1 0 2380 88060 1060944
Visualizando os tipos de colunas do banco de dados

Visulizando a distribuição de valores ausentes

Tratamento de dados
Colocando as colunas em minúsculo
names(sinistrosRecifeRaw) <- tolower(names(sinistrosRecifeRaw))
Criando uma coluna a partir de varias usando a função coalesce
sinistrosRecifeRaw <- sinistrosRecifeRaw %>%
mutate(automoveis = coalesce(auto, onibus, caminhao, viatura, ciclom)) %>%
mutate(divisao_da_via = coalesce(divisao_via1, divisao_via2, divisao_via3)) %>%
mutate(outros_envolvidos = coalesce(outros, ciclista, pedestre)
)
Remove as colunas que já foram unificadas e não serão necessarias
mais pra frente
sinistrosRecifeRaw <- sinistrosRecifeRaw %>%
select( -c("auto", "onibus", "caminhao", "viatura", "ciclom","divisao_via1","divisao_via2","divisao_via3", "outros", "ciclista", "pedestre"))
Criando a coluna de rotulo (o “y” usado nos modelos)
sinistrosRecifeFinal <- sinistrosRecifeRaw %>%
mutate(acidente_com_vitima = case_when(
natureza_acidente == 'COM VÍTIMA' ~ 1,
natureza_acidente == 'VÍTIMA FATAL' ~ 1,
TRUE ~ 0
)
)
sinistrosRecifeFinal$acidente_com_vitima <- as.integer(sinistrosRecifeFinal$acidente_com_vitima)
Movendo o rotulo(“y”) para a primeira posicao do dataset
sinistrosRecifeFinal <- sinistrosRecifeFinal %>% select(acidente_com_vitima, everything())
Preenchendo valores faltantes checando se o tamanho do conteudo
preenchido é menor que 1
sinistrosRecifeFinal$bairro[str_length(sinistrosRecifeFinal$bairro) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$sentido_via[str_length(sinistrosRecifeFinal$sentido_via) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$tipo[str_length(sinistrosRecifeFinal$tipo) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$intervalo_dia[str_length(sinistrosRecifeFinal$intervalo_dia) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$dia_semana[str_length(sinistrosRecifeFinal$dia_semana) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$tempo_clima[str_length(sinistrosRecifeFinal$tempo_clima) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$situacao_semaforo[str_length(sinistrosRecifeFinal$situacao_semaforo) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$situacao_placa[str_length(sinistrosRecifeFinal$situacao_placa) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$velocidade_max_via[str_length(sinistrosRecifeFinal$velocidade_max_via) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$divisao_da_via[str_length(sinistrosRecifeFinal$divisao_da_via) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$situacao[str_length(sinistrosRecifeFinal$situacao) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$natureza_acidente[str_length(sinistrosRecifeFinal$natureza_acidente) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$acidente_verificado[str_length(sinistrosRecifeFinal$acidente_verificado) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$sinalizacao[str_length(sinistrosRecifeFinal$sinalizacao) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$conservacao_via[str_length(sinistrosRecifeFinal$conservacao_via) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$condicao_via[str_length(sinistrosRecifeFinal$condicao_via) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$ponto_controle[str_length(sinistrosRecifeFinal$ponto_controle) < 1 ] <- "NAO INFORMADO"
sinistrosRecifeFinal$mao_direcao[str_length(sinistrosRecifeFinal$mao_direcao) < 1 ] <- "NAO INFORMADO"
Observando quantitativamente os dados
## variable q_zeros p_zeros q_na
## acidente_com_vitima acidente_com_vitima 546 0.2294117647 0
## data data 0 0.0000000000 0
## hora hora 0 0.0000000000 0
## natureza_acidente natureza_acidente 0 0.0000000000 0
## situacao situacao 0 0.0000000000 0
## bairro bairro 0 0.0000000000 0
## endereco endereco 0 0.0000000000 0
## numero numero 0 0.0000000000 0
## detalhe_endereco_acidente detalhe_endereco_acidente 0 0.0000000000 0
## complemento complemento 0 0.0000000000 0
## bairro_cruzamento bairro_cruzamento 0 0.0000000000 0
## num_semaforo num_semaforo 1 0.0004201681 0
## sentido_via sentido_via 0 0.0000000000 0
## tipo tipo 0 0.0000000000 0
## moto moto 946 0.3974789916 0
## vitimas vitimas 557 0.2340336134 0
## vitimasfatais vitimasfatais 2355 0.9894957983 0
## acidente_verificado acidente_verificado 0 0.0000000000 0
## tempo_clima tempo_clima 0 0.0000000000 0
## situacao_semaforo situacao_semaforo 0 0.0000000000 0
## sinalizacao sinalizacao 0 0.0000000000 0
## condicao_via condicao_via 0 0.0000000000 0
## conservacao_via conservacao_via 0 0.0000000000 0
## ponto_controle ponto_controle 0 0.0000000000 0
## situacao_placa situacao_placa 0 0.0000000000 0
## velocidade_max_via velocidade_max_via 0 0.0000000000 0
## mao_direcao mao_direcao 0 0.0000000000 0
## ano ano 0 0.0000000000 0
## mes mes 0 0.0000000000 0
## dia dia 0 0.0000000000 0
## intervalo_dia intervalo_dia 0 0.0000000000 0
## dia_semana dia_semana 0 0.0000000000 0
## automoveis automoveis 645 0.2710084034 0
## divisao_da_via divisao_da_via 0 0.0000000000 0
## outros_envolvidos outros_envolvidos 2365 0.9936974790 0
## p_na q_inf p_inf type unique
## acidente_com_vitima 0 0 0 integer 2
## data 0 0 0 Date 363
## hora 0 0 0 character 1019
## natureza_acidente 0 0 0 character 4
## situacao 0 0 0 character 4
## bairro 0 0 0 character 89
## endereco 0 0 0 character 551
## numero 0 0 0 character 909
## detalhe_endereco_acidente 0 0 0 character 505
## complemento 0 0 0 character 2115
## bairro_cruzamento 0 0 0 character 89
## num_semaforo 0 0 0 character 333
## sentido_via 0 0 0 character 42
## tipo 0 0 0 character 21
## moto 0 0 0 integer 5
## vitimas 0 0 0 integer 7
## vitimasfatais 0 0 0 integer 2
## acidente_verificado 0 0 0 character 8
## tempo_clima 0 0 0 character 4
## situacao_semaforo 0 0 0 character 6
## sinalizacao 0 0 0 character 5
## condicao_via 0 0 0 character 5
## conservacao_via 0 0 0 character 5
## ponto_controle 0 0 0 character 6
## situacao_placa 0 0 0 character 21
## velocidade_max_via 0 0 0 character 12
## mao_direcao 0 0 0 character 3
## ano 0 0 0 integer 1
## mes 0 0 0 integer 12
## dia 0 0 0 integer 31
## intervalo_dia 0 0 0 character 4
## dia_semana 0 0 0 character 7
## automoveis 0 0 0 integer 8
## divisao_da_via 0 0 0 character 9
## outros_envolvidos 0 0 0 integer 3
Enriquecimento de dados
# Junta os dados das duas fontes acima a partir das colunas ["bairro"] existente em cada fonte
sinistrosRecifeFinal <- left_join(sinistrosRecifeFinal, numero_acidentes_com_vitimas_por_bairro, by = c("bairro" = "bairro"))
#Se algum bairro não apresentar o total de acidentes c/vitimas será preenchido com ZERO (0) para evitar a existencia de NA value
sinistrosRecifeFinal$total_acidentes_com_vitimas_por_bairro <-
replace(
sinistrosRecifeFinal$total_acidentes_com_vitimas_por_bairro,
is.na(sinistrosRecifeFinal$total_acidentes_com_vitimas_por_bairro),
0
)
Removendo da memoria alguns objetos que não serão mais
utilizados
rm( sinistrosRecifeRaw,
acidentes_com_vitimas_por_bairro,
acidentes_condicao_via,
acidentes_dia_semana,
acidentes_interv_dia,
bairro_acidente,
condicao_tempo_clima,
direcao_via,
distribuicao_natureza_acidente,
estado_vias,
numero_acidentes_com_vitimas_por_bairro,
ocorrencias_mes,
ocorrencias_situacao,
situacao_placa_amostra,
tipos_acidentes,
velocidade_max_via_amostra
)
Filtrando apenas os registros cujo status é finalizado que é o que
interessa para treinar os modelos
sinistrosRecifeFinal <- sinistrosRecifeFinal %>% filter(situacao == 'FINALIZADA')
ncol(sinistrosRecifeFinal)
## [1] 36
nrow(sinistrosRecifeFinal)
## [1] 2096
Removendo colunas após a realização da permuta de variáveis
sinistrosRecifeFinal <- sinistrosRecifeFinal %>%
select( -c("data","hora","ano", "mes", "dia","vitimas", "vitimasfatais", "bairro", "endereco", "numero", "detalhe_endereco_acidente", "complemento", "natureza_acidente", "sentido_via", "num_semaforo", "situacao", "bairro_cruzamento"))
Conferindo a remoção das colunas
status(sinistrosRecifeFinal)
## variable
## acidente_com_vitima acidente_com_vitima
## tipo tipo
## moto moto
## acidente_verificado acidente_verificado
## tempo_clima tempo_clima
## situacao_semaforo situacao_semaforo
## sinalizacao sinalizacao
## condicao_via condicao_via
## conservacao_via conservacao_via
## ponto_controle ponto_controle
## situacao_placa situacao_placa
## velocidade_max_via velocidade_max_via
## mao_direcao mao_direcao
## intervalo_dia intervalo_dia
## dia_semana dia_semana
## automoveis automoveis
## divisao_da_via divisao_da_via
## outros_envolvidos outros_envolvidos
## total_acidentes_com_vitimas_por_bairro total_acidentes_com_vitimas_por_bairro
## q_zeros p_zeros q_na p_na q_inf
## acidente_com_vitima 441 0.210400763 0 0 0
## tipo 0 0.000000000 0 0 0
## moto 803 0.383110687 0 0 0
## acidente_verificado 0 0.000000000 0 0 0
## tempo_clima 0 0.000000000 0 0 0
## situacao_semaforo 0 0.000000000 0 0 0
## sinalizacao 0 0.000000000 0 0 0
## condicao_via 0 0.000000000 0 0 0
## conservacao_via 0 0.000000000 0 0 0
## ponto_controle 0 0.000000000 0 0 0
## situacao_placa 0 0.000000000 0 0 0
## velocidade_max_via 0 0.000000000 0 0 0
## mao_direcao 0 0.000000000 0 0 0
## intervalo_dia 0 0.000000000 0 0 0
## dia_semana 0 0.000000000 0 0 0
## automoveis 576 0.274809160 0 0 0
## divisao_da_via 0 0.000000000 0 0 0
## outros_envolvidos 2082 0.993320611 0 0 0
## total_acidentes_com_vitimas_por_bairro 7 0.003339695 0 0 0
## p_inf type unique
## acidente_com_vitima 0 integer 2
## tipo 0 character 11
## moto 0 integer 5
## acidente_verificado 0 character 8
## tempo_clima 0 character 4
## situacao_semaforo 0 character 6
## sinalizacao 0 character 5
## condicao_via 0 character 5
## conservacao_via 0 character 5
## ponto_controle 0 character 6
## situacao_placa 0 character 5
## velocidade_max_via 0 character 6
## mao_direcao 0 character 3
## intervalo_dia 0 character 4
## dia_semana 0 character 7
## automoveis 0 integer 6
## divisao_da_via 0 character 9
## outros_envolvidos 0 integer 3
## total_acidentes_com_vitimas_por_bairro 0 numeric 43
Convertendo em valores binários
#definindo uma semente
set.seed(1401)
sinistrosRecifeDummy <- dummyVars(" ~ .", data=sinistrosRecifeFinal)
sinistrosRecifeBinarizado <- data.frame(predict(sinistrosRecifeDummy, newdata=sinistrosRecifeFinal))
Treino e Teste: Pré-processamento
Particionando os dados
#converte a coluna usada como "y" em factor
sinistrosRecifeBinarizado$acidente_com_vitima = as.factor(sinistrosRecifeBinarizado$acidente_com_vitima)
# cria a partição 70-30
particao_sinistros = caret::createDataPartition(sinistrosRecifeBinarizado$acidente_com_vitima, p=.7, list = F)
# treino
treino_sinistros = sinistrosRecifeBinarizado[particao_sinistros, ]
# - treino = teste
teste_sinistros = sinistrosRecifeBinarizado[-particao_sinistros, ]
Criando o controle para validação cruzada
train.control <- trainControl(method = "cv", number = 10, verboseIter = T)
Treinando os modelos
Regressão Linear
#sinistros_LM <- train(acidente_com_vitima ~ ., data = treino_sinistros, method = "lm", trControl = train.control)
#summary(sinistros_LM) # sumário do modelo linear
#var_importance <- varImp(sinistros_LM, scale = FALSE)
#plot(var_importance, top = 20) # importância das variáveis
Árvore de Decisão
## + Fold01: cp=0.02265
## - Fold01: cp=0.02265
## + Fold02: cp=0.02265
## - Fold02: cp=0.02265
## + Fold03: cp=0.02265
## - Fold03: cp=0.02265
## + Fold04: cp=0.02265
## - Fold04: cp=0.02265
## + Fold05: cp=0.02265
## - Fold05: cp=0.02265
## + Fold06: cp=0.02265
## - Fold06: cp=0.02265
## + Fold07: cp=0.02265
## - Fold07: cp=0.02265
## + Fold08: cp=0.02265
## - Fold08: cp=0.02265
## + Fold09: cp=0.02265
## - Fold09: cp=0.02265
## + Fold10: cp=0.02265
## - Fold10: cp=0.02265
## Aggregating results
## Selecting tuning parameters
## Fitting cp = 0.0227 on full training set


KNN
## + Fold01: k=5
## - Fold01: k=5
## + Fold01: k=7
## - Fold01: k=7
## + Fold01: k=9
## - Fold01: k=9
## + Fold02: k=5
## - Fold02: k=5
## + Fold02: k=7
## - Fold02: k=7
## + Fold02: k=9
## - Fold02: k=9
## + Fold03: k=5
## - Fold03: k=5
## + Fold03: k=7
## - Fold03: k=7
## + Fold03: k=9
## - Fold03: k=9
## + Fold04: k=5
## - Fold04: k=5
## + Fold04: k=7
## - Fold04: k=7
## + Fold04: k=9
## - Fold04: k=9
## + Fold05: k=5
## - Fold05: k=5
## + Fold05: k=7
## - Fold05: k=7
## + Fold05: k=9
## - Fold05: k=9
## + Fold06: k=5
## - Fold06: k=5
## + Fold06: k=7
## - Fold06: k=7
## + Fold06: k=9
## - Fold06: k=9
## + Fold07: k=5
## - Fold07: k=5
## + Fold07: k=7
## - Fold07: k=7
## + Fold07: k=9
## - Fold07: k=9
## + Fold08: k=5
## - Fold08: k=5
## + Fold08: k=7
## - Fold08: k=7
## + Fold08: k=9
## - Fold08: k=9
## + Fold09: k=5
## - Fold09: k=5
## + Fold09: k=7
## - Fold09: k=7
## + Fold09: k=9
## - Fold09: k=9
## + Fold10: k=5
## - Fold10: k=5
## + Fold10: k=7
## - Fold10: k=7
## + Fold10: k=9
## - Fold10: k=9
## Aggregating results
## Selecting tuning parameters
## Fitting k = 7 on full training set


Selecionando o melhor modelo
melhor_modelo <- resamples(list(
#LM = sinistros_LM,
KNN = sinistros_KNN,
RPART = sinistros_RPART,
RF = sinistros_RF,
ADABOOST = sinistros_ADA
))
summary(melhor_modelo)
##
## Call:
## summary.resamples(object = melhor_modelo)
##
## Models: KNN, RPART, RF, ADABOOST
## Number of resamples: 10
##
## Accuracy
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## KNN 0.8163265 0.8384354 0.8435374 0.8439987 0.8551859 0.8639456 0
## RPART 0.8503401 0.8603229 0.8775510 0.8746669 0.8888967 0.8979592 0
## RF 0.8707483 0.8837597 0.8877551 0.8978334 0.9214193 0.9319728 0
## ADABOOST 0.8424658 0.8690476 0.8843537 0.8828394 0.8911565 0.9315068 0
##
## Kappa
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## KNN 0.3197913 0.3940855 0.4432638 0.4260329 0.4563530 0.5196826 0
## RPART 0.4464766 0.5254149 0.5855512 0.5661974 0.6246062 0.6388206 0
## RF 0.5536199 0.6111716 0.6464390 0.6736003 0.7607615 0.8003260 0
## ADABOOST 0.4110838 0.5192768 0.5987918 0.5781570 0.6233016 0.7734327 0
Criando a matriz de confusão e visualizando a acuidade do melhor
modelo (Floresta Aleatória)
# cria predição
predicao_sinistros_RF <- predict(sinistros_RF, teste_sinistros)
cm_sinistros_RF <- confusionMatrix(predicao_sinistros_RF, teste_sinistros$acidente_com_vitima)
cm_sinistros_RF
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 89 28
## 1 43 468
##
## Accuracy : 0.8869
## 95% CI : (0.8595, 0.9106)
## No Information Rate : 0.7898
## P-Value [Acc > NIR] : 1.099e-10
##
## Kappa : 0.6447
##
## Mcnemar's Test P-Value : 0.09661
##
## Sensitivity : 0.6742
## Specificity : 0.9435
## Pos Pred Value : 0.7607
## Neg Pred Value : 0.9159
## Prevalence : 0.2102
## Detection Rate : 0.1417
## Detection Prevalence : 0.1863
## Balanced Accuracy : 0.8089
##
## 'Positive' Class : 0
##
cm_sinistros_RF$table
## Reference
## Prediction 0 1
## 0 89 28
## 1 43 468
# Expected Accuracy (AccE) = Acuidade Esperada = estimativa de acuidade "esperada", ou seja,
#uma acuidade mínima que poderia ser conseguida simplesmente "chutando" a classe de forma aleatória.
gtBaixa <- cm_sinistros_RF$table[1]+cm_sinistros_RF$table[2]
gtAlta <- cm_sinistros_RF$table[3]+cm_sinistros_RF$table[4]
pdBaixa <- cm_sinistros_RF$table[1]+cm_sinistros_RF$table[2]
pdAlta <- cm_sinistros_RF$table[3]+cm_sinistros_RF$table[4]
gtTotal <- gtAlta + gtBaixa
estAcc <- (gtBaixa*pdBaixa/gtTotal^2)+(gtAlta*pdAlta/gtTotal^2)
#acuidade
estAcc
## [1] 0.6679784